deploy: Start hardlinking kernel/initramfs on single-part again
authorColin Walters <walters@verbum.org>
Mon, 25 Apr 2016 19:59:36 +0000 (15:59 -0400)
committerColin Walters (automation) <walters+githubbot@verbum.org>
Tue, 26 Apr 2016 11:48:42 +0000 (11:48 +0000)
Commit
https://github.com/ostreedev/ostree/commit/1810de2b51680dbf35fdbd33d0a8d7e65eadc91f
lost an optimization where we would try hardlinks for the
kernel/initramfs in `/boot`.  This would be a noticeable space savings
on single-partition systems.

Closes: #277
Approved by: gatispaeglis

src/libostree/ostree-sysroot-deploy.c

index 8877236562075048c1503ce2d23950a9debc1e5c..d1d624b6b79a3ed2709f1cdf072351ea439dacc5 100644 (file)
@@ -87,6 +87,39 @@ symlink_at_replace (const char    *oldpath,
   return ret;
 }
 
+/* Try a hardlink if we can, otherwise fall back to copying.  Used
+ * right now for kernels/initramfs in /boot, where we can just
+ * hardlink if we're on the same partition.
+ */
+static gboolean
+hardlink_or_copy_at (int         src_dfd,
+                     const char *src_subpath,
+                     int         dest_dfd,
+                     const char *dest_subpath,
+                     GCancellable  *cancellable,
+                     GError       **error)
+{
+  gboolean ret = FALSE;
+
+  if (linkat (src_dfd, src_subpath, dest_dfd, dest_subpath, 0) != 0)
+    {
+      if (errno == EMLINK || errno == EXDEV)
+        {
+          return glnx_file_copy_at (src_dfd, src_subpath, NULL, dest_dfd, dest_subpath, 0,
+                                    cancellable, error);
+        }
+      else
+        {
+          glnx_set_error_from_errno (error);
+          goto out;
+        }
+    }
+
+  ret = TRUE;
+ out:
+  return ret;
+}
+
 static gboolean
 dirfd_copy_attributes_and_xattrs (int            src_parent_dfd,
                                   const char    *src_name,
@@ -1337,9 +1370,9 @@ install_deployment_kernel (OstreeSysroot   *sysroot,
           glnx_set_prefix_error_from_errno (error, "fstat %s", dest_kernel_name);
           goto out;
         }
-      if (!glnx_file_copy_at (tree_boot_dfd, tree_kernel_name, NULL,
-                              bootcsum_dfd, dest_kernel_name, 0,
-                              cancellable, error))
+      if (!hardlink_or_copy_at (tree_boot_dfd, tree_kernel_name,
+                                bootcsum_dfd, dest_kernel_name,
+                                cancellable, error))
         goto out;
     }
 
@@ -1354,9 +1387,9 @@ install_deployment_kernel (OstreeSysroot   *sysroot,
               glnx_set_prefix_error_from_errno (error, "fstat %s", dest_initramfs_name);
               goto out;
             }
-          if (!glnx_file_copy_at (tree_boot_dfd, tree_initramfs_name, NULL,
-                                  bootcsum_dfd, dest_initramfs_name, 0,
-                                  cancellable, error))
+          if (!hardlink_or_copy_at (tree_boot_dfd, tree_initramfs_name,
+                                    bootcsum_dfd, dest_initramfs_name,
+                                    cancellable, error))
             goto out;
         }
     }